package com.summer.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.summer.common.exceptionHandler.myException.CategoryServiceException;
import com.summer.entity.Category;
import com.summer.entity.Dish;
import com.summer.entity.SetMeal;
import com.summer.mapper.CategoryMapper;
import com.summer.service.CategoryService;
import com.summer.service.DishService;
import com.summer.service.SetMealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;

@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {

   @Autowired
   private DishService dishService;

   @Autowired
   private SetMealService setMealService;

    /**
     * TODO 扩展此方法或添加一个根据id删除的方法，因为此业务根据id删除每次都要进行关联检查，所以干脆就使用前者，但耦合度相对高于后者，还是建议后者
     * @param id 获取id
     * @return  检查通过则返回true
     */
    @Override
    public boolean removeById(Serializable id) {
        // 1. 判断是否关联菜品，若关联则抛出自定义异常
            //1.1 调用dish业务层方法根据categoryId查询总条目数
        LambdaQueryWrapper<Dish> lqw1 = new LambdaQueryWrapper<>();
        lqw1.eq(Dish::getCategoryId, id);
        int count1 = dishService.count(lqw1);
            //1.2 若总条目数大于0则抛出CategoryService异常，异常信息为：此分类关联了？个菜品，无法删除！
        if (count1 > 0){
            throw new CategoryServiceException("此分类关联了" +count1+ "个菜品，无法删除！");
        }

        // 2. 判断是否关联套餐，若关联则抛出自定义异常
            //2.1 调用setMeal业务层方法根据categoryId查询总条目数
        LambdaQueryWrapper<SetMeal> lqw2 = new LambdaQueryWrapper<>();
        lqw2.eq(SetMeal::getCategoryId, id);
        int count2 = setMealService.count(lqw2);
            //2.2 若总条目数大于0则抛出CategoryService异常，异常信息为：此分类关联了？个套餐，无法删除！
        if (count2 > 0){
            throw new CategoryServiceException("此分类关联了" +count2+ "个套餐，无法删除！");
        }

        // 3. 不关联上面两步，调用删除方法
        return super.removeById(id);
    }
}
